/*!
 * \file WtUftStraDemo.h
 * \project WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief WonderTrader UFT超高频策略示例头文件
 * 
 * \details 该文件定义了WtUftStraDemo类，提供UFT超高频交易策略的完整示例实现：
 *          
 *          核心超高频算法：
 *          - 微秒级延迟响应：极致优化的事件处理机制
 *          - 高频订单管理：支持大量并发订单的实时管理
 *          - 智能撤单机制：基于时间和市场条件的动态撤单
 *          - 通道监控：实时监控交易通道状态和质量
 *          
 *          策略特性：
 *          - 多线程安全：使用SpinMutex实现无锁并发
 *          - 内存优化：精心设计的数据结构减少内存访问延迟
 *          - 异常处理：完善的错误恢复和状态管理
 *          - 性能监控：实时统计和性能分析
 *          
 *          技术实现：
 *          - 无锁编程：SpinMutex保证高并发下的数据一致性
 *          - 预分配内存：避免运行时内存分配导致的延迟
 *          - CPU亲和性：针对特定CPU核心优化
 *          - 缓存友好：数据结构布局优化内存访问模式
 *          
 *          应用场景：
 *          - 做市商策略：高频报价和撤单操作
 *          - 套利交易：快速捕捉和执行套利机会
 *          - 冲击成本控制：大单拆分和智能执行
 *          - 流动性提供：为市场提供高质量的买卖报价
 *          
 *          性能要求：
 *          - 延迟要求：微秒级响应时间
 *          - 吞吐量：每秒处理数万笔订单
 *          - 可靠性：7x24小时稳定运行
 *          - 实时性：毫秒级市场数据处理
 */

#pragma once
#include <unordered_set>
#include <memory>
#include <thread>
#include <mutex>

#include "../Includes/UftStrategyDefs.h"
#include "../Share/SpinMutex.hpp"

/*!
 * \class WtUftStraDemo
 * \brief UFT超高频交易策略示例实现
 * 
 * \details 该类实现了UftStrategy接口，提供完整的超高频交易策略框架：
 *          
 *          核心功能：
 *          - 实时价格监控：微秒级Tick数据处理
 *          - 智能订单管理：高并发订单创建、修改和撤销
 *          - 通道状态监控：交易通道连接质量实时监控
 *          - 风险控制：实时头寸和风险敞口管理
 *          
 *          算法特点：
 *          - 高频交易逻辑：基于价格微观变化的交易决策
 *          - 动态参数调整：根据市场状态实时调整策略参数
 *          - 订单生命周期管理：从下单到成交的全流程跟踪
 *          - 延迟优化：最小化每个环节的处理时间
 *          
 *          并发安全设计：
 *          - SpinMutex：针对短临界区的高性能锁
 *          - 原子操作：避免锁竞争的无锁数据结构
 *          - 线程安全：多线程环境下的数据一致性保证
 *          - 内存序：确保多核环境下的内存访问顺序
 *          
 *          性能优化：
 *          - 预分配对象池：避免运行时动态内存分配
 *          - 缓存行对齐：减少False Sharing提高缓存效率
 *          - 分支预测：优化条件判断的CPU流水线效率
 *          - 系统调用最小化：减少内核态切换开销
 * 
 * \note 该策略适用于需要极致性能的超高频交易场景
 * \warning 超高频交易对系统性能和稳定性要求极高，需要专业的运维支持
 * \see UftStrategy, IUftStraCtx, SpinMutex
 */
class WtUftStraDemo : public UftStrategy
{
public:
	/*!
	 * \brief 构造函数
	 * \param id 策略实例唯一标识符
	 */
	WtUftStraDemo(const char* id);
	
	/*!
	 * \brief 析构函数
	 */
	~WtUftStraDemo();

private:
	/*!
	 * \brief 检查订单状态
	 * 
	 * \details 定期检查所有活跃订单的状态：
	 *          - 超时订单自动撤销
	 *          - 部分成交订单处理
	 *          - 异常订单状态清理
	 *          - 订单统计和分析
	 */
	void	check_orders();

public:
	/*!
	 * \brief 获取策略名称
	 * \return 策略名称字符串
	 */
	virtual const char* getName() override;

	/*!
	 * \brief 获取策略工厂名称
	 * \return 工厂名称字符串
	 */
	virtual const char* getFactName() override;

	/*!
	 * \brief 初始化策略参数
	 * \param cfg 配置参数对象
	 * \return 初始化成功返回true，失败返回false
	 * 
	 * \details 从配置文件中读取超高频策略参数：
	 *          - code: 交易品种代码
	 *          - secs: 策略运行周期（秒）
	 *          - freq: 交易频率控制
	 *          - offset: 价格偏移量
	 *          - lots: 每次交易手数
	 */
	virtual bool init(WTSVariant* cfg) override;

	/*!
	 * \brief 策略初始化事件
	 * \param ctx 策略上下文
	 * 
	 * \details 策略启动时调用，执行初始化操作：
	 *          - 订阅市场数据
	 *          - 初始化内部状态
	 *          - 启动后台监控线程
	 */
	virtual void on_init(IUftStraCtx* ctx) override;

	/*!
	 * \brief Tick数据事件处理
	 * \param ctx 策略上下文
	 * \param code 品种代码
	 * \param newTick 新的Tick数据
	 * 
	 * \details 处理实时Tick数据，这是超高频策略的核心：
	 *          - 微秒级价格分析
	 *          - 实时交易信号生成
	 *          - 高频订单决策
	 *          - 市场微观结构分析
	 */
	virtual void on_tick(IUftStraCtx* ctx, const char* code, WTSTickData* newTick) override;

	/*!
	 * \brief K线数据事件处理
	 * \param ctx 策略上下文
	 * \param code 品种代码
	 * \param period K线周期
	 * \param times K线次数
	 * \param newBar 新的K线数据
	 * 
	 * \details 处理K线数据更新事件，用于：
	 *          - 中长期趋势分析
	 *          - 策略参数动态调整
	 *          - 风险控制指标计算
	 */
	virtual void on_bar(IUftStraCtx* ctx, const char* code, const char* period, uint32_t times, WTSBarStruct* newBar) override;

	/*!
	 * \brief 交易成交事件处理
	 * \param ctx 策略上下文
	 * \param localid 本地订单ID
	 * \param stdCode 标准合约代码
	 * \param isLong 是否为多头方向
	 * \param offset 开平仓标志
	 * \param qty 成交数量
	 * \param price 成交价格
	 * 
	 * \details 处理订单成交事件：
	 *          - 更新持仓信息
	 *          - 计算交易成本
	 *          - 统计策略绩效
	 *          - 触发后续交易逻辑
	 */
	virtual void on_trade(IUftStraCtx* ctx, uint32_t localid, const char* stdCode, bool isLong, uint32_t offset, double qty, double price) override;

	/*!
	 * \brief 持仓变化事件处理
	 * \param ctx 策略上下文
	 * \param stdCode 标准合约代码
	 * \param isLong 是否为多头方向
	 * \param prevol 变化前总持仓
	 * \param preavail 变化前可用持仓
	 * \param newvol 变化后总持仓
	 * \param newavail 变化后可用持仓
	 * 
	 * \details 处理持仓变化事件：
	 *          - 实时风险监控
	 *          - 持仓状态更新
	 *          - 保证金计算
	 *          - 风险敞口控制
	 */
	virtual void on_position(IUftStraCtx* ctx, const char* stdCode, bool isLong, double prevol, double preavail, double newvol, double newavail) override;

	/*!
	 * \brief 订单状态变化事件处理
	 * \param ctx 策略上下文
	 * \param localid 本地订单ID
	 * \param stdCode 标准合约代码
	 * \param isLong 是否为多头方向
	 * \param offset 开平仓标志
	 * \param totalQty 订单总数量
	 * \param leftQty 剩余数量
	 * \param price 订单价格
	 * \param isCanceled 是否已撤销
	 * 
	 * \details 处理订单状态变化事件：
	 *          - 订单生命周期管理
	 *          - 部分成交处理
	 *          - 撤单原因分析
	 *          - 订单执行统计
	 */
	virtual void on_order(IUftStraCtx* ctx, uint32_t localid, const char* stdCode, bool isLong, uint32_t offset, double totalQty, double leftQty, double price, bool isCanceled) override;

	/*!
	 * \brief 交易通道就绪事件处理
	 * \param ctx 策略上下文
	 * 
	 * \details 当交易通道连接成功时调用：
	 *          - 恢复交易活动
	 *          - 重新订阅数据
	 *          - 状态同步
	 */
	virtual void on_channel_ready(IUftStraCtx* ctx) override;

	/*!
	 * \brief 交易通道断开事件处理
	 * \param ctx 策略上下文
	 * 
	 * \details 当交易通道连接断开时调用：
	 *          - 暂停新订单
	 *          - 保存当前状态
	 *          - 启动重连机制
	 */
	virtual void on_channel_lost(IUftStraCtx* ctx) override;

	/*!
	 * \brief 订单委托结果事件处理
	 * \param localid 本地订单ID
	 * \param bSuccess 委托是否成功
	 * \param message 错误消息
	 * 
	 * \details 处理订单委托结果：
	 *          - 委托失败重试机制
	 *          - 错误原因分析
	 *          - 异常订单处理
	 */
	virtual void on_entrust(uint32_t localid, bool bSuccess, const char* message) override;

private:
	WTSTickData*	_last_tick;			/*!< 最新Tick数据缓存，用于价格分析 */
	IUftStraCtx*	_ctx;				/*!< 策略上下文指针，访问交易接口 */
	std::string		_code;				/*!< 交易品种代码 */
	uint32_t		_secs;				/*!< 策略运行周期（秒） */
	uint32_t		_freq;				/*!< 交易频率控制参数 */
	int32_t			_offset;			/*!< 价格偏移量，用于报价调整 */
	double			_lots;				/*!< 每次交易手数 */
	double			_prev;				/*!< 前一个价格，用于价格变化检测 */

	typedef std::unordered_set<uint32_t> IDSet;
	IDSet			_orders;			/*!< 活跃订单ID集合，跟踪所有未完成订单 */
	SpinMutex		_mtx_ords;			/*!< 订单集合的自旋锁，保证线程安全 */

	uint64_t		_last_entry_time;	/*!< 最后入场时间，用于交易频率控制 */

	bool			_channel_ready;		/*!< 交易通道状态标志 */
	uint32_t		_last_calc_time;	/*!< 最后计算时间，用于定时任务 */
	uint32_t		_cancel_cnt;		/*!< 撤单统计计数器，用于策略分析 */
};

